<template>
  <div>
    <h1>商圈列表</h1>
    <el-row>
      <el-col :span="20" :push='2'>
        <div>
          <el-form :inline="true">
            <el-form-item style="float: left" label="查询商圈信息:">
              <el-input v-model="search" placeholder="查询所需要的内容......"></el-input>
            </el-form-item>
            <el-form-item style="float: right">
              <el-button type="primary" size="small" icon="el-icon-edit-outline" @click="handleAdd">添加</el-button>
            </el-form-item>
          </el-form>
        </div>
        <div class="table">
          <el-table
            :data="tables.slice((page-1)*pageSize,page*pageSize)"
            border
            style="width: 100%">
            <el-table-column
              type="index"
              label="序号"
              align="center"
              width="160">
            </el-table-column>
            <el-table-column
              label="编号"
              align="center"
              width="200px">
              <template slot-scope="scope">
                <span>{{ scope.row.id}}</span>
              </template>
            </el-table-column>
            <el-table-column
              label="名称"
              align="center"
              width="270px">
              <template slot-scope="scope">
                <span>{{ scope.row.tradeAreaName}}</span>
              </template>
            </el-table-column>
            <el-table-column
              label="地址"
              align="center"
              width="340px">
              <template slot-scope="scope">
                <span>{{ scope.row.tradeAreaAddress}}</span>
              </template>
            </el-table-column>
            <el-table-column
              label="所在地区"
              align="center"
              width="270px">
              <template slot-scope="scope">
                <span>{{ scope.row.district}}</span>
              </template>
            </el-table-column>
            <el-table-column label="操作" align="center" width="160px">
              <template slot-scope="scope">
                <el-button
                  size="mini"
                  type="danger"
                  @click="handleDelete(scope.row)">删除</el-button>
              </template>
            </el-table-column>
          </el-table>
          <el-col :span="24" class="el-table_footstool">
            <el-pagination layout="total, sizes, prev, pager, next, jumper" @size-change="handleSizeChange" @current-change="handleCurrentChange" :page-sizes="[10, 15]" :page-size="pageSize" :total="tables.length" style="float:right;">
            </el-pagination>
          </el-col>
        </div>
      </el-col>
    </el-row>
    <el-dialog
      title="添加商圈"
      :visible.sync="centerDialogVisible"
      width="50%"
      center>
      <el-form :model="form" style="padding-left: 20px" ref="formAdd">
        <el-form-item label="商圈名称" :label-width="formLabelWidth">
          <el-input v-model="form.name" autocomplete="off" style="width: 80%"></el-input>
        </el-form-item>
        <el-form-item label="所在省份" :label-width="formLabelWidth">
          <el-select v-model="form.province" placeholder="请选择省份" style="width: 80%"  @change="getCities">
            <el-option
              v-for="item in optionsProvince"
              :key="item"
              :label="item"
              :value="item">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="所在城市" :label-width="formLabelWidth">
          <el-select v-model="form.city" placeholder="请选择城市" style="width: 80%" @change="getDistricts">
            <el-option
              v-for="item in optionsCity"
              :key="item"
              :label="item"
              :value="item">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="所在地区" :label-width="formLabelWidth" >
          <el-select v-model="form.districtId" placeholder="请选择地区" style="width: 80%">
            <el-option
              v-for="item in optionsDistrict"
              :key="item.district"
              :label="item.district"
              :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="商圈地址" :label-width="formLabelWidth">
          <el-input v-model="form.address" autocomplete="off" style="width: 80%"></el-input>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
    <el-button @click="handleCancel('formAdd')">取 消</el-button>
    <el-button type="primary" @click="handleSummit('formAdd')">确 定</el-button>
  </span>
    </el-dialog>
  </div>
</template>

<script>
import tradeAreaApi from '@/api/system/tradeArea'
import communityMapApi from '@/api/community/communityMap'
export default {
  name: 'tradeArea',
  data () {
    return {
      centerDialogVisible: false, // 添加商圈弹窗显示初始化，不显示
      optionsProvince: [], // 下拉列表显示的省份
      optionsCity: [], // 下拉列表显示的城市
      optionsDistrict: [], // 下拉列表显示的地区
      form: { // 添加商圈的表单信息
        name: '', // 商圈的名字
        address: '', // 商圈地址
        province: '', // 商圈所在省份
        city: '', // 商圈所在城市
        districtId: ''// 商圈所在地区
      },
      tradeAreas: [], // 商圈列表
      search: '', // 搜索关键词
      page: 1, // 页号
      pageSize: 10, // 页面的最大显示数据量
      formLabelWidth: 10 // 表单标签的长度
    }
  },
  computed: {
    // 模糊搜索
    tables () {
      const search = this.search
      if (search) {
        // filter() 方法创建一个新的数组，新数组中的元素是通过检查指定数组中符合条件的所有元素
        return this.tradeAreas.filter(data => {
          // some() 方法用于检测数组中的元素是否满足指定条件;
          // some() 方法会依次执行数组的每个元素：
          // 如果有一个元素满足条件，则表达式返回true , 剩余的元素不会再执行检测;
          // 如果没有满足条件的元素，则返回false。
          return Object.keys(data).some(key => {
            // indexOf() 返回某个指定的字符在某个字符串中首次出现的位置，如果没有找到就返回-1；
            return String(data[key]).toLowerCase().indexOf(search) > -1
          })
        })
      }
      return this.tradeAreas
    }
  },
  methods: {
    /**
     * 添加商圈表单取消按钮点击事件，将表单内容清空，并隐藏表单弹窗
     */
    handleCancel (formAdd) {
      this.form = {brand_right: 0}
      this.$refs[formAdd].resetFields()
      this.centerDialogVisible = false
    },
    /**
     *通过api获取数据库中所存储的省份
     */
    getProvinces () {
      communityMapApi.getProvinceList().then(res => {
        this.optionsProvince = res
      })
    },
    /**
     * 通过传所选省份的id给api来获取当前省份的所有城市
     */
    getCities () {
      communityMapApi.getCityList(this.form.province).then(res => {
        this.optionsCity = res
      })
    },
    /**
     * 通过传递所选城市的id给api来获取当前城市的所有地区
     */
    getDistricts () {
      communityMapApi.getDistrictListByCity(this.form.city).then(res => {
        this.optionsDistrict = res.data
      })
    },
    /**
     * 通过调用api来获取商圈列表
     */
    getTradeAreaList () {
      tradeAreaApi.getTradeAreaList().then(res => {
        this.tradeAreas = res.data
      })
    },
    /**
     * 删除按钮点击事件，当删除一行数据时，重新获取商圈列表
     */
    handleDelete (row) {
      tradeAreaApi.deleteTradeArea(row.id).then(res => {
        this.$message({
          type: 'success',
          message: '删除成功'
        })
        this.getTradeAreaList()
        this.page = 1
      }
      )
    },
    /**
     * 添加按钮点击事件，显示添加商圈弹窗
     */
    handleAdd () {
      this.centerDialogVisible = true
    },
    /**
     *添加商圈表单提交按钮点击事件，添加数据后，清空表单数据，将弹窗隐藏并更新商圈列表
     */
    handleSummit (formAdd) {
      this.$refs[formAdd].validate((valid) => {
        if (valid) {
          tradeAreaApi.addTradeArea(this.form).then(res => {
            this.$message({
              type: 'success',
              message: '添加成功'
            })
            this.form = {brand_right: 0}
            this.$refs[formAdd].resetFields()
            this.centerDialogVisible = false
            this.getTradeAreaList()
          }
          )
        } else {
          return false
        }
      })
    },
    // 初始页page、初始每页数据数pageSize和数据data
    handleSizeChange (size) {
      this.pageSize = size
    },
    handleCurrentChange (val) {
      this.page = val
    }
  },
  /**
   * 在创建页面时获取商圈列表及省市区列表
   */
  created () {
    this.getTradeAreaList()
    this.getProvinces()
  }
}
</script>

<style scoped>

</style>
